/*
 * Client.h
 *
 *  Created on: 2010-05-28
 *      Author: mateusz
 */

#ifndef CLIENT_H_
#define CLIENT_H_

#include <ClanLib/core.h>
#include <ClanLib/network.h>

#include "Player.h"

/**
 * Klasa obslugująca połączenie z serwerem. Ma sygnały do których można
 * podpiąć obsługe zaistniałych eventów.
 */

class Client
{
public:
	Client();
	~Client();

	/**
	 * Łączy sie z serwerem
	 * @param ip ip serwera
	 */
	void connect(CL_String ip);

	/**
	 * Zwraca sygnał do obsługi eventu podłączenia sie nowego gracza
	 */
	CL_Signal_v1<int>& getSignalPlayerConnected() { return signalPlayerConnected; }

	/**
	 * Zwraca sygnał do obsługi eventu rozłączanie sie przeciwnika
	 */
	CL_Signal_v1<int>& getSignalPlayerDisconnected() { return signalPlayerDisconnected; }

	/**
	 * Zwraca sygnał eventu o smierci przeciwnika
	 */
	CL_Signal_v1<int>& getSignalPlayerDead() { return signalPlayerDead; }

	/**
	 * Sygnał eventu zmiany mapy
	 */
	CL_Signal_v1<CL_String>& getSignalMap() { return signalMap; }

	/**
	 * Sygnał eventu zmiany położenia przez przeciwnika
	 */
	CL_Signal_v3<int,int,int>& getSignalPlayerMove() { return signalPlayerMove; }

	/**
	 * Sygnał eventu podłożenia bomby przez przeciwnika
	 */
	CL_Signal_v3<int,int,int>& getSignalPlayerBombPlant() { return signalPlayerBombPlant; }

	/**
	 * Sygnał eventu o rozpoczęciu rozgrywki
	 */
	CL_Signal_v0& getSignalStartGame() { return signalStartGame; }

	/**
	 * Sygnał o nadaniu przez serwer id.
	 */
	CL_Signal_v0& getSignalId() { return signalId; }

	/**
	 * Wysyła event do serwera
	 * @param event wysyłany event
	 */
	void send(const CL_NetGameEvent &event);

	/**
	 * Zwraca id gracza
	 */
	int getId() { return id; }
private:
	void onConnected();
	void onDisconnected();

	void onEventReceived(const CL_NetGameEvent &e);

	void handlePlayerConnected(const CL_NetGameEvent &event);
	void handlePlayerDisconnected(const CL_NetGameEvent &event);

	void handleMap(const CL_NetGameEvent &event);
	void handleDead(const CL_NetGameEvent &event);

	void handlePlayerMove(const CL_NetGameEvent &event);
	void handlePlayerBombPlant(const CL_NetGameEvent &event);

	void handleStartGame(const CL_NetGameEvent &event);
	void handleId(const CL_NetGameEvent &event);

	CL_NetGameClient network_client;
	CL_SlotContainer slots;

	int id;

	CL_Signal_v0 signalStartGame;
	CL_Signal_v0 signalId;
	CL_Signal_v1<CL_String> signalMap;

	CL_Signal_v1<int> signalPlayerConnected;
	CL_Signal_v1<int> signalPlayerDisconnected;
	CL_Signal_v1<int> signalPlayerDead;

	CL_Signal_v3<int,int,int> signalPlayerMove;
	CL_Signal_v3<int,int,int> signalPlayerBombPlant;
};

#endif /* CLIENT_H_ */
